perm filename TRAPD.L[FTL,LSP] blob
sn#826375 filedate 1986-10-21 generic text, type T, neo UTF8
;;; -*- Mode:LISP; Package:(PCL LISP 1000); Base:10; Syntax:Common-lisp -*-
;;;
;;; *************************************************************************
;;; Copyright (c) 1985 Xerox Corporation. All rights reserved.
;;;
;;; Use and copying of this software and preparation of derivative works
;;; based upon this software are permitted. Any distribution of this
;;; software or derivative works must comply with all applicable United
;;; States export control laws.
;;;
;;; This software is made available AS IS, and Xerox Corporation makes no
;;; warranty about the software, its performance or its conformity to any
;;; specification.
;;;
;;; Any person obtaining a copy of this software is requested to send their
;;; name and post office or electronic mail address to:
;;; CommonLoops Coordinator
;;; Xerox Artifical Intelligence Systems
;;; 2400 Hanover St.
;;; Palo Alto, CA 94303
;;; (or send Arpanet mail to CommonLoops-Coordinator.pa@Xerox.arpa)
;;;
;;; Suggestions, comments and requests for improvements are also welcome.
;;; *************************************************************************
;;;
;;; Trapped discriminators.
;;;
;;; These allow someone to declare that for a given selector, the methods
;;; should actually be defined on some other selector, the so-called trap-
;;; selector.
;;;
;;; An example of its use is:
;;; (make-primitive-specializable 'car 'car-trap)
;;;
(in-package 'pcl)
(ndefstruct (trapped-discriminator-mixin
(:class class)
(:include discriminator)
(:conc-name trapped-discriminator-))
(trap-discriminator ()))
(defmeth trapped-discriminator-selector ((self trapped-discriminator-mixin))
(let ((td (trapped-discriminator-trap-discriminator self)))
(and td (discriminator-name td))))
(defmeth add-method-internal ((self trapped-discriminator-mixin)
(method basic-method))
(with (self) (add-method-internal trap-discriminator method)))
(ndefstruct (trapped-discriminator
(:class class)
(:include (trapped-discriminator-mixin discriminator))))
(defun make-primitive-specializable (name trap-selector &rest options)
(let ((trap-discriminator
(apply #'make-specializable trap-selector arglist)))
(setf (discriminator-named name)
(make 'trapped-discriminator
:name name
:trap-discriminator trap-discriminator))))